package model;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class File {
	private String relativePath;
	private byte[] binary;

	public File(long idAuthor, String fileName, byte[] workFile) throws Exception {
		if (workFile == null) {
			throw new Exception("Por favor, escolha o arquivo de upload!");
		}
		if (idAuthor < 1) {
			throw new RuntimeException("Tentativa de Criar de file com idAuthor 0 ou negativo!");
		}
		fileName = removeSpecialChar(fileName);
		if (fileName.trim().equals("")) {
			throw new Exception("Escolha um arquivo para fazer upload!");
		}

		this.relativePath = idAuthor + "/" + fileName;
		this.binary = workFile;
	}

	private String removeSpecialChar(String string) {
		return string.replaceAll(" ", "_").replaceAll("[^a-zA-Z0-9_\\.]+", "");
	}

	/**
	 * @return the relative path in the file system.
	 */
	public String save() throws Exception {
		try {
			FileOutputStream fos = new FileOutputStream(Configuration.FILES_LOCATION + relativePath);
			fos.write(binary);
			fos.flush();
			fos.getFD().sync();
			fos.close();
		} catch (FileNotFoundException notFound) {
			java.io.File filesDir = new java.io.File((Configuration.FILES_LOCATION + relativePath).replaceAll("[^/]+$",
					""));
			if (!filesDir.exists()) {
				if (filesDir.mkdirs()) {
					save();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Erro ao salvar arquivo: " + e.getMessage());
		}
		// TODO salvar nos diretórios, porém garantir que só existe 1 com
		// aquele titulo, acho q no
		// caso, o usuário deve escolher se sobrescreve ou não seu trabalho
		// anterior
		return relativePath;
	}

	public String getPath() {
		return relativePath;
	}

	public byte[] getBinary() {
		return binary;
	}

	public static void delete(String filePath) {
		// TODO Auto-generated method stub

	}

	public static void main(String[] args) {
		System.out.println("oi fer a".replaceAll(" ", "_"));
	}

}
